home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / lib / gprim / discgrp / polyhedron.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-02-08  |  5.2 KB  |  228 lines

  1. /* 
  2.  *    polyhedron.c:    routines which operate on the polyhedron data structure
  3.  */
  4. /*
  5. */
  6.  
  7. #include "geom.h"
  8. #include "geomclass.h"
  9. #include "polylistP.h"
  10. #include "ooglutil.h"
  11. #include "point.h"
  12. #include "winged_edge.h"
  13. #include "extern.h"
  14.  
  15. Geom *
  16. WEPolyhedronToVect(poly, origin)
  17. WEpolyhedron *poly;
  18. HPoint3 origin;
  19. {
  20.     int i, k, ii, jj;
  21.     Geom *orbit;
  22.     HPoint3 gorigin;
  23.     static HPoint3 origin2 = {0,0,0,1};
  24.     WEface *fptr;
  25.     Transform T;
  26.     short *vnvert;
  27.     short *vncolor;
  28.     HPoint3 *p;
  29.     ColorA *c;
  30.  
  31.     vnvert = OOGLNewN(short, poly->num_faces);
  32.     vncolor = OOGLNewN(short, poly->num_faces);
  33.     p = OOGLNewN(HPoint3, 2*poly->num_faces);
  34.     c = OOGLNewN(ColorA, poly->num_faces);
  35.     
  36.     for (k = 0, i=0, fptr=poly->face_list; i<poly->num_faces; 
  37.      ++i, fptr = fptr->next)
  38.     {
  39.     vnvert[i] = 2;    /* line segment! */
  40.     vncolor[i] = 1;
  41.     /* next two lines assume the indices in two sorts of groups match */
  42.     c[i] =  GetCmapEntry( fptr->fill_tone);
  43.     for (ii=0; ii<4; ++ii) for (jj=0; jj<4; ++jj)    
  44.         /* fptr's tforms are transposed! */
  45.         T[jj][ii] = fptr->group_element[ii][jj];
  46.     HPt3Transform( T, &origin, &gorigin);
  47.     p[2*i] = origin;
  48.     p[2*i+1] = gorigin;
  49.     }
  50.  
  51.     orbit = GeomCreate("vect", 
  52.                 CR_NOCOPY,
  53.                 CR_NVECT, poly->num_faces,
  54.                 CR_NVERT, 2*poly->num_faces,
  55.                 CR_NCOLR, poly->num_faces,
  56.                 CR_VECTC, vnvert,
  57.                 CR_COLRC, vncolor,
  58.                 CR_POINT4, p,
  59.                 CR_COLOR, c, 
  60.                 CR_4D, 1,
  61.                 CR_END);
  62.     return(orbit);
  63. }
  64. static ColorA white = {1,1,1,1};
  65.  
  66. Geom *
  67.   WEPolyhedronToPolyList(poly)
  68. WEpolyhedron *poly;
  69. {
  70.   ColorA *colors = NULL;
  71.   HPoint3 *points = NULL;
  72.   int *nvert = NULL;
  73.   int *vindex = NULL;
  74.   
  75.   WEvertex    *vptr;
  76.   WEedge    *eptr;
  77.   WEface    *fptr;
  78.   int        cnt,  cnt2, total;
  79.   
  80.   Geom *plist;
  81.   
  82.   points = OOGLNewN(HPoint3, poly->num_vertices);
  83.   colors = OOGLNewN(ColorA,poly->num_faces);
  84.   nvert = OOGLNewN(int, poly->num_faces);
  85.  
  86.   vptr = poly->vertex_list;
  87.   cnt = 0;
  88.   do {
  89.     points[cnt].x = vptr->x[0];
  90.     points[cnt].y = vptr->x[1];
  91.     points[cnt].z = vptr->x[2];
  92.     points[cnt].w = vptr->x[3];
  93.     vptr->ideal = cnt++;
  94.     vptr = vptr->next;
  95.   } while (vptr != NULL);
  96.   
  97.   cnt = 0;
  98.   fptr = poly->face_list;
  99.   total = 0;
  100.   do {
  101.     colors[cnt] = GetCmapEntry(fptr->fill_tone);
  102.     nvert[cnt] = fptr->order;
  103.     total += nvert[cnt++];
  104.     fptr = fptr->next;
  105.   } while (fptr != NULL);
  106.   vindex = OOGLNewN(int, total);
  107.   cnt = 0;
  108.   fptr = poly->face_list;
  109.   do {
  110.     eptr = fptr->some_edge;
  111.     cnt2 = 0;
  112.     do {
  113.       if (eptr->fL == fptr) {
  114.     vindex[cnt+cnt2] = eptr->v0->ideal;
  115.     cnt2++;
  116.     eptr = eptr->e1L;
  117.       } else {
  118.     vindex[cnt+cnt2] = eptr->v1->ideal;
  119.     cnt2++;
  120.     eptr = eptr->e0R;
  121.       }
  122.     } while (eptr != fptr->some_edge);
  123.     cnt+= fptr->order;
  124.     fptr = fptr->next;  }
  125.   while (fptr != NULL);
  126.   
  127.   plist = 
  128.     GeomCreate("polylist", 
  129.         /*CR_NOCOPY,        isn't supported for polylists! */
  130.         CR_4D, 1,
  131.         CR_NPOLY, poly->num_faces, 
  132.                CR_NVERT, nvert, 
  133.         CR_VERT, vindex, 
  134.         CR_POINT4, points, 
  135.         CR_POLYCOLOR, colors, 
  136.         CR_FLAG, PL_HASPCOL,     /* put this here or meet a bug libpolylist */
  137.         CR_END);
  138.   return(plist);
  139. }
  140.  
  141. Geom *
  142. WEPolyhedronToBeams( WEpolyhedron *poly, float alpha)
  143. {
  144.     WEedge *eptr;
  145.     WEvertex *vptr;
  146.     Geom *beams;
  147.     HPoint3 *points, p0, p1, v0, v1;
  148.     ColorA *colors;
  149.     int *nvert, *vindex, vcnt, fcnt;
  150.     float omega; 
  151.     static ColorA white = {1,1,1,1};
  152.  
  153.     points = OOGLNewN(HPoint3, 4 * poly->num_edges);
  154.     colors = OOGLNewN(ColorA,  poly->num_edges);
  155.     nvert = OOGLNewN(int, poly->num_edges);
  156.     vindex = OOGLNewN(int, 4*poly->num_edges);
  157.  
  158.     omega = 1.0 - alpha;
  159.  
  160.     vcnt = fcnt = 0;
  161.     eptr = poly->edge_list;
  162. #define CCOPY( d4, hpt3)    \
  163.     (hpt3)->x = d4[0];    \
  164.     (hpt3)->y = d4[1];    \
  165.     (hpt3)->z = d4[2];    \
  166.     (hpt3)->w = d4[3];
  167.     do {
  168.     CCOPY( eptr->v0->x, &v0);
  169.           if (eptr->e0L->v0 = eptr->v0)    vptr = eptr->e0L->v1;
  170.           else vptr = eptr->e0L->v0;
  171.     CCOPY( vptr->x, &v1);
  172.     HPt3Scale(omega, &v0, &p0);
  173.     HPt3Scale(alpha, &v1, &p1);
  174.     HPt3Add(&p0, &p1, &points[vcnt]);
  175.     vindex[vcnt] = vcnt;
  176.     vcnt++;
  177.  
  178.     if (eptr->fR == eptr->e0R->fR)    
  179.           if (eptr->e0R->v0 = eptr->v0)    vptr = eptr->e0R->v1;
  180.           else vptr = eptr->e0R->v0;
  181.     else 
  182.           if (eptr->e0L->v0 = eptr->v0)    vptr = eptr->e0L->v1;
  183.           else vptr = eptr->e0L->v0;
  184.     CCOPY( vptr->x, &v1);
  185.     HPt3Scale(alpha, &v1, &p1);
  186.     HPt3Add(&p0, &p1, &points[vcnt]);
  187.     vindex[vcnt] = vcnt;
  188.     vcnt++;
  189.  
  190.     CCOPY( eptr->v1->x, &v0);
  191.           if (eptr->e1R->v0 = eptr->v1)    vptr = eptr->e1R->v1;
  192.           else vptr = eptr->e1R->v0;
  193.     CCOPY( vptr->x, &v1);
  194.     HPt3Scale(omega, &v0, &p0);
  195.     HPt3Scale(alpha, &v1, &p1);
  196.     HPt3Add(&p0, &p1, &points[vcnt]);
  197.     vindex[vcnt] = vcnt;
  198.     vcnt++;
  199.  
  200.           if (eptr->e1L->v0 = eptr->v1)    vptr = eptr->e1L->v1;
  201.           else vptr = eptr->e1L->v0;
  202.     CCOPY( vptr->x, &v1);
  203.     HPt3Scale(alpha, &v1, &p1);
  204.     HPt3Add(&p0, &p1, &points[vcnt]);
  205.     vindex[vcnt] = vcnt;
  206.     vcnt++;
  207.  
  208.         colors[fcnt] = white;
  209.         nvert[fcnt] = 4;
  210.     fcnt++;
  211.  
  212.           eptr = eptr->next;
  213.     }
  214.     while (eptr != NULL);
  215.  
  216.     beams = GeomCreate("polylist",
  217.                 CR_NPOLY, poly->num_edges,
  218.                CR_NVERT, nvert, 
  219.                 CR_VERT, vindex,
  220.                 CR_POINT4, points,
  221.                 CR_POLYCOLOR, colors,
  222.                 CR_FLAG, PL_HASPCOL,    /* put this here or meet a bug libpolyli
  223. st */
  224.                 CR_END);
  225.     return(beams);
  226. }
  227.  
  228.